﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
<Serializable()> Public MustInherit Class ObjektKO
    Public LichtfarbeNormal, LichtfarbeGabe, LichtfarbeSpezial, LichtfarbeDoppel As Color
    Public Const Radius As Integer = 3
    <Serializable()> Structure StringUndZahl
        Public ID As String
        Public Wert As Single
        Public Sub New(ByVal ID As String, ByVal Wert As Single)
            Me.ID = ID
            Me.Wert = Wert
        End Sub
        Public Sub New(ByVal Gesamt() As String)
            Me.ID = Gesamt(0)
            Me.Wert = Gesamt(1)
        End Sub
        Public Overrides Function ToString() As String
            Return ID + "_" + Wert.ToString
        End Function

    End Structure
#Region "Gabe"
    Enum Gabemodi
        Keine
        Gabe
        Spezialgabe
        Doppelgabe
    End Enum
    Enum Effekte
        Keiner
        Schock
        Nuklearverseuchung
    End Enum
    Enum KIGabeEinsatzstellen
        RundenAnfang
        RundenEnde
        Beides
    End Enum
    Enum Kampfboni
        No
        Vision
        Indirects
        EnemyAttack
    End Enum
    Enum Bewegungsarten
        Sonne
        Schnee
        Regen
        Sandsturm
        Eins
    End Enum
    Enum ReperaturGebäude
        Own
        Allied
        OwnAndEnemy
        OwnAndNeutral
        AlliedAndEnemy
        AlliedAndNeutral
        AlliedAndEnemyAndNeutral
        OwnAndEnemyAndNeutral
    End Enum
    Private Gabemodis As Gabemodi
    Public Property Gabemodus() As Gabemodi
        Get
            Return Gabemodis
        End Get
        Set(ByVal value As Gabemodi)
            Gabemodis = value
        End Set
    End Property
    Private Gabeleist As Integer
    Public Property Gabeleiste() As Integer
        Get
            Return Gabeleist
        End Get
        Set(ByVal value As Integer)
            Gabeleist += value * Gabenfüller
            If Gabeleist > (SpezialgabeKosten + Gabekosten) * Sternkosten Then
                Gabeleist = (SpezialgabeKosten + Gabekosten) * Sternkosten
            End If
        End Set
    End Property
    <NonSerialized()> Public Gabekosten As Integer
    ''' <summary>
    ''' Die Spezialgabe Sterne
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public SpezialgabeKosten As Integer
    ''' <summary>
    ''' Wie viel ein Stern kostet
    ''' </summary>
    ''' <remarks></remarks>
    Public Sternkosten As Integer = 0
    ''' <summary>
    ''' So viel teurer werden Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Teurungsrate As Single = 1
    ''' <summary>
    ''' Die Namen der KO Gaben
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Gaben() As String
    ''' <summary>
    ''' In diesem Bereich werden KO Fähigkeit eingesetzt!!!
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KORange As Integer = -1
    Public Function GetKORange() As Integer
        If KORange >= 0 Then
            If Gabemodus = Gabemodi.Keine Then
                If (Gabekosten + SpezialgabeKosten) * Sternkosten / 2 <= Gabeleiste Then
                    If SpezialgabeKosten > 0 Or Gabekosten > 0 Then
                        Return KORange + 1
                    Else
                        Return KORange
                    End If
                Else
                    Return KORange
                End If
            Else
                Return -1
            End If
        Else
            Return KORange
        End If
    End Function
    ''' <summary>
    ''' Die ID dieses KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public KOID As String
    ''' <summary>
    ''' Der Name dieses KO
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KOname As String
    ''' <summary>
    ''' ID im Objektverwalter Array
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Bild As Integer
    ''' <summary>
    ''' Um so viel werden Truppen auf Gebäuden geheilt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GebäudeHeilung As Integer = 2
    ''' <summary>
    ''' So viel können Fernwaffen weiter schießen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Reichweite As Integer = 0
    ''' <summary>
    ''' Bonus zum Besetzen von Gebäuden
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Besetzer As Single = 0
    ''' <summary>
    ''' Das Glück des KO's
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Glück As Integer = 5
    ''' <summary>
    ''' Das Pech des KO's
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Pech As Integer = 0
    ''' <summary>
    ''' Geld welches man pro Stadt mehr bekommt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public BonusGeldproGebäude As Integer = 0
    ''' <summary>
    ''' Senkung der Treibstoffkosten in der Luft
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public SpritsenkungLuft As Integer = 0
    ''' <summary>
    ''' Senkung der Treibstoffkosten auf See
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public SpritsenkungSee As Integer = 0
    ''' <summary>
    ''' Um wie viel die Feuerkraft steigt je nach Landschaftsuntergrund
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public LandschaftsStärke As Integer = 0
    ''' <summary>
    ''' Eine TerrainID oder "Deckung" erhöht die Feuerkraft je nach LandschaftsStärke
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public LandschaftsUntergrund() As String = {}
    ''' <summary>
    ''' Feuerstärke aller Truppen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public OffensivStärke As ObjektTabelle = Nothing
    ''' <summary>
    ''' Deffensive Stärke aller Truppen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public DeffensivStärke As ObjektTabelle = Nothing
    ''' <summary>
    ''' Wenn true dann werden KP und Ladung versteckt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Verstecker As Boolean = False
    ''' <summary>
    ''' Um so viel wird die ATK bei einem Wetter erhöht
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Wetterbouns As Integer = 0
    ''' <summary>
    ''' Bei diesem Wetter wird die ATK erhöht um Wetterbonus
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Wetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne
    ''' <summary>
    ''' Bei diesem Wetter ändern sich die Bewegungspunkte
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Bewegunssenker() As ObjektSpielfeld.Wetterarten = {}
    ''' <summary>
    ''' Auf diesen Wert werden die Bewegungspunkte gesetzt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Bewegungswetter() As Bewegungsarten = {}
    ''' <summary>
    ''' Um wie viel die Reichweite bei bestimmten Wetterarten sich ändern
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public WetterReichweitenbonus() As Integer = {-1}
    ''' <summary>
    ''' Bei welchem Wetter die Reichweitenänderung stattfindet.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public WetterartfürSenker() As ObjektSpielfeld.Wetterarten = {ObjektSpielfeld.Wetterarten.Sandsturm}
    ''' <summary>
    ''' Der Boost pro Sende Turm
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public SendeTurmStärke As Point = New Point(10, 0)
    ''' <summary>
    ''' Zusatzdeffensive bei Direkt und Indirekten Angriffen
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Zusatzdeffensive As New Point
    ''' <summary>
    ''' Wie schnell sich die Gabeleiste auffüllt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Gabenfüller As Single = 1
    ''' <summary>
    ''' Die Hintergrundsmusik dieses KO's
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Musik As String = "Andy"
    ''' <summary>
    ''' Die Armee des KO's
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Armee As String = Armeen.OS.ToString
    ''' <summary>
    ''' Für so viel Fonds steigt die Feuerkraft
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Geldstärke As Integer = -10
    ''' <summary>
    ''' Klaut dem Gegner Fonds für jeden Angriff
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Geldraub As Single = -1
    ''' <summary>
    ''' Die Synergie nur während der Doppelgabe ungleich 0
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Synergie As Integer = 0
    ''' <summary>
    ''' Deckungsänderung pro Stern
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public DeckungsÄnderung As Integer = 1
    ''' <summary>
    ''' Offensiv Erhöhung für Nah-und Fernkämpfer
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Zusatzoffensive As New Point
    ''' <summary>
    ''' Sichtbonus für alle Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Sichtbonus As Integer = 0
    ''' <summary>
    ''' Wenn größer Null führen wir einen zweiten Angriff mit n-facher Stärke des Startangriffes aus.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public DoppelAngriff As Single = 0
    ''' <summary>
    ''' Wir nehmen keinen Gegenschaden.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KeinGegenSchaden As Boolean = False
    ''' <summary>
    ''' Fernwaffen können ziehen und feuern.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public MoveandFire As Boolean = False
    ''' <summary>
    ''' Bonus für Truppen die sich mehr bewegen können.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Bewegungsbonus As BewegungsboniTabelle = Nothing
    ''' <summary>
    ''' Bonus für Truppen wenn feinde gesehen werden usw.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Kampfbonus As Kampfboni = Kampfboni.No
    ''' <summary>
    ''' Bonus pro Truppe die den Kampfbonus erfüllt.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public StärkebonusproEinheit As Integer = 0
    ''' <summary>
    ''' Truppen haben KP+Kampfverstärker Angriffskraft.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Kampfverstärker As Integer = 0
    ''' <summary>
    ''' Wenn größer Null kann man nur noch einen N-Ten Bruchteil des Lebens abziehen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Maximalschaden As Single = -1
    ''' <summary>
    ''' Fernwaffen können Feuern und ziehen
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public FireandMove As Boolean = False
    ''' <summary>
    ''' Mit dieser Zahl wird der KOnterschaden multipliziert
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GegenFeuerkraft As Single = 1
    ''' <summary>
    ''' Wenn größer Null entzieht man dem Gegner Leben
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Lebensentzug As Single = 0
    ''' <summary>
    ''' Wenn true kann man auch die Komma Zahl des Lebens sehen
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GenauesLebenAnzeigen As Boolean = False
    ''' <summary>
    ''' Der Spieler dem der KO zugeordnet ist
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Spieler As Integer = -1
    ''' <summary>
    ''' Einheiten können nach ihrem Bau ziehen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public NachBauZiehen As Boolean = False
    ''' <summary>
    ''' Der erste Punkt bedeutet die Feuerkraftsteigerung, wenn Gruppen von X Einheiten oder mehr Angegriffen werden und eine Steigerung um Y.
    ''' Der zweite Punkt bedeutet die Feuerkraftsteigerung, wenn Gruppen von X Einheiten oder weniger Angegriffen werden und eine Feuerkraftsteigerung um Y.
    ''' Der Radius sind immer 3 Felder.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GruppenBoost As Point() = {New Point(0, 0), New Point(0, 0)}
    ''' <summary>
    ''' X=ATK Steigerung Y Radius wie weit man vom Berg weg sein darf, kann
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Bergbonus As Point = New Point(0, 0)
    ''' <summary>
    ''' Wenn wir Schaden nehmen bekommen wir etwas Geld zurück.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GeldFürEigenSchaden As Single = 0
    ''' <summary>
    '''X=1 dann True müssen wir den Kriegsnebel wieder zurücksetzen X=0 Nichts passiert
    '''Y= Resttage.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KriegsnebelErstellung As New Point
    ''' <summary>
    ''' Wenn True dann kann man immer in Wälder und Riffe schauen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public RiffWaldSchauer As Boolean = False
    ''' <summary>
    ''' Wenn Einkommen größer Fonds verliert man die Werte, wenn größer gewinnt man sie für jede 10%
    ''' X=ATK Y=Kosten.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ATKundKostensteigererfürFonds As Point = New Point(0, 0)
    ''' <summary>
    ''' Umso viel wird für jede Mine die Produktionskosten gesenkt.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Minenstärke As Single = 0.05#
    ''' <summary>
    ''' Wenn ungleich 0 dann nimmt der Gegner Schaden wenn wir angegriffen wurden umso mehr Schaden wir erlitten haben.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ErhöhterGegenschadenbeiEigenSchaden As Single = 0
    ''' <summary>
    ''' Wenn true können die eigenen Truppen nur von Einheiten die gleich viel oder mehr gekostet haben Angegriffen werden.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KeinAngriffmitBilligerenTruppen As Boolean = False
    ''' <summary>
    ''' Wenn true dann haben wir maximales Glück wenn der Gegner dadurch zerstört würde.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public MaxGlückbeiZerstörung As Boolean = False
    ''' <summary>
    ''' Je weniger TP umso schlechter kämpfen wir.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ZusätlicheKampfschwächeproTP As Integer = 0
    ''' <summary>
    ''' Wenn true hat man immer Maximales Glück.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ImmerMaxGlück As Boolean = False
    ''' <summary>
    ''' Umso viel steigt der Angriff bei Angriffen auf eine bestimmte Landschaft
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public AufLandschaftsStärke As Integer = 0
    ''' <summary>
    ''' Die Landschaften auf die man schießen muss.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public AufLandschaftsUntergrund() As String = {}
    ''' <summary>
    ''' Wir richten immer so viel mehr Schaden aus.LOL.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public FesterZusatzschadenUndDeffensive As New Point(0, 0)
    ''' <summary>
    ''' Der Spieler verdient so viel Geld mehr oder weniger.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public MehrEinkommen As Single = 0
    ''' <summary>
    ''' Für jede Deckung unseres Gegner sind wir so viel stärker.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public FeuerstärkeproFeindlicherDeckung As Integer = 0
    ''' <summary>
    ''' Wenn die TP des Gegner kleiner sind als die eigenen kämpfen die Truppen besser.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ATKHochfürSchwacheGegner As Single = 0
    ''' <summary>
    ''' Die Bewegungskosten auf diesen Feldern ist.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public NeueBewegungskosten As Integer() = {}
    ''' <summary>
    ''' Auf dieser Landschaft sind die Bewegungskosten X
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public BewegungskostenUntergrund As String() = {}
    ''' <summary>
    ''' Wenn der Schaden größer X ist fliegt die Einheit Y Felder weg.=) und nimmt dabei Schaden
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Schadensflug As New Point(0, 0)
    ''' <summary>
    ''' Wenn unser Feind so wenig TP hat oder weniger dann wird er gelähmt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Lähmschaden As Integer = -1
    ''' <summary>
    ''' Wenn unsere Einheit überlebt bekommen wir am Kampfende so viel TP zurück wenn wir zerstört werden nimmt unser Gegner so viel Schaden.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KampfSchadenHeilung As Integer = 0
    ''' <summary>
    ''' Wir erhalten eine Zusatzdeffensive Y und Zusatzoffensive X wenn wir einen Feind zerstören.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ATKDEFBoostdurchZerstörung As New Point(0, 0)
    ''' <summary>
    ''' Eine zufällige Einheit erhält Y Bewegungspunkte und X ATK Boost
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public AnyUnitKampfverstärker As New Point(0, 0)
    ''' <summary>
    ''' Wenn ungleich Null erhäht sich die ATK um den Wert und die Einheit kann noch mal ziehen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public NochMalZiehenUndKampfänderNachZerstörung As Integer = 0
    ''' <summary>
    ''' Wenn True erhalten Feinde keine Infos über die Gabeleiste
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GabeleistenVerstecker As Boolean = False
    ''' <summary>
    ''' Wenn True machen wir einen Angriff wenn wir in eine Falle laufen.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public FallenAngriff As Boolean = False
    ''' <summary>
    ''' Wenn True können Gegner keine Einsicht in die Fonds nehmen
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public KeineFondsInfos As Boolean = False
    ''' <summary>
    ''' Wenn True können angegriffene Truppen sich in der nächsten Runde nicht reparieren
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public ReperaturVerbotNachKampf As Boolean = False
    ''' <summary>
    ''' Wenn kleiner Null wird die Besetzungszahl eines Gebäudes gesenkt, wenn eine Einheit drauf vernichtet wird.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public BesetzungsbonusNachEinheitenZerstörung As Integer = 0
    ''' <summary>
    ''' X Gibt an auf welchen Wert Wenn Y=1 dann Eigene, wenn Y=2 dann Feind bei Y=0 nichts
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public BewegungsKostenÄnderungNachZerstörung As Point = New Point(0, 0)
    ''' <summary>
    ''' X,Y ist der Ort des Gebäudes und Z ist die Senkungszahl.
    ''' </summary>
    ''' <remarks></remarks>
    Public BonusGebäude As Vector3() = {}
    ''' <summary>
    ''' Diese Einheiten kosten mehr oder weniger.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public BonusEinheiten() As StringUndZahl = {}
    ''' <summary>
    ''' X=Stärke Y=Schaden für den jeweils Stärke verursacht wird.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public RadioaktiveStärke As Point = New Point(0, 0)
    ''' <summary>
    ''' Bestimmt wann die KI ihre Gabeeinsetzt
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GabeEinsatzstelle As KIGabeEinsatzstellen = KIGabeEinsatzstellen.RundenAnfang
    ''' <summary>
    ''' Gibt zurück wie viele Felder wir maximal Laufen können damit wir eine Feldtarnung erhalten
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public FeldtarnungsReichweite As Integer = -1
    ''' <summary>
    ''' Landschaften in der ersten Dimension bekommen die Bewegungskosten der Landschaft in der 2 Dimension.
    ''' Olaf Schnee in Ebene verwandeln.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public LandschaftsVertauschung(,) As String = {}
    ''' <summary>
    ''' Nahkampf Einheiten erhalten einen Fernkampf. Außer Bomber und Zeppelin
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public NahkampfReichweitenBonus As Integer = 0
    ''' <summary>
    ''' Welche Gebäude unsere Truppen reparieren.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public RepairON As ReperaturGebäude = ReperaturGebäude.Own
    ''' <summary>
    ''' Sagt auf welchen Gebäuden der KO bauen kann.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Baugebäude As ReperaturGebäude = ReperaturGebäude.Own
    ''' <summary>
    ''' Wenn false verliert der KO keine Feuerkraft wenn die TP sinken.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public FeuerVerlustbeiKP As Boolean = True
    ''' <summary>
    ''' Gebäude Heilen und richten mehr Schaden an wenn größer Null
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public GebäudeZusatzSchaden As Integer = 0
    ''' <summary>
    ''' Wenn true werden alle Sprites zu Infis und der Schaden wird falsch angezeigt.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public SpriteVertauschung As Boolean = False
    ''' <summary>
    ''' Bei diesem Wetter sind die Truppen ohne Auswirkung.
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Wetterimmunität As ObjektSpielfeld.Wetterarten() = {}
    ''' <summary>
    ''' Die Einheit die der KO ist!
    ''' </summary>
    ''' <remarks></remarks>
    Protected KOEinheit As ObjektEinheit = Nothing
    Public Function GetKOEinheit() As ObjektEinheit
        Return KOEinheit
    End Function
    Public Sub SetKOEinheit(ByVal E As ObjektEinheit)
        KOEinheit = E
        If Not KOEinheit Is Nothing Then
            KOEinheit.TruppenStufe = ObjektEinheit.Stufe.KO
        Else
            KOEinheit = Nothing
            'Gabeleiste geht zurück!
            Gabeleist = 0
        End If
    End Sub
    Public Sub KOEinheitWechsel()
        KOEinheit = Nothing
    End Sub
    Public Function IsInKOZone(ByVal X As Integer, ByVal Y As Integer) As Boolean
        If GetKORange() >= 0 Then
            If KOEinheit Is Nothing Then
                Return False
            Else
                If KOEinheit.GetDistance(New Point(X, Y)) <= KORange Then
                    Return True
                Else
                    Return False
                End If
            End If
        Else
            Return True
        End If
    End Function
    Public Function IsInKOZone(ByVal Einheit As ObjektEinheit) As Boolean
        If GetKORange() >= 0 Then
            If KOEinheit Is Nothing Then
                Return False
            Else
                If KOEinheit.GetDistance(Einheit) <= KORange Then
                    Return True
                Else
                    Return False
                End If
            End If
        Else
            Return True
        End If
    End Function
#End Region
    Public Sub New(ByVal Spieler As Integer, ByVal GabeEinsatzstelle As KIGabeEinsatzstellen)
        Me.Spieler = Spieler
        Me.GabeEinsatzstelle = GabeEinsatzstelle

        'Für 3D
        LichtfarbeNormal = Color.White
        LichtfarbeGabe = Color.Yellow
        LichtfarbeSpezial = Color.Red
        LichtfarbeDoppel = Color.Blue
    End Sub
    Public Sub New(ByVal Spieler As Integer, ByVal Gabefüllstand As Integer, ByVal Gabenart As Gabemodi, ByVal neuSternkosten As Integer, ByVal GabeEinsatzstelle As KIGabeEinsatzstellen)
        Gabeleist = Gabefüllstand
        Gabemodus = Gabenart
        Sternkosten = neuSternkosten
        Me.Spieler = Spieler
        Me.GabeEinsatzstelle = GabeEinsatzstelle

        'Für 3D
        LichtfarbeNormal = Color.FromArgb(255, 255, 255)
        LichtfarbeGabe = Color.FromArgb(200, 255, 255)
        LichtfarbeSpezial = Color.FromArgb(255, 200, 255)
        LichtfarbeDoppel = Color.FromArgb(255, 255, 200)
    End Sub
    Public MustOverride Sub KOLaden()
    Public Overridable Function GetBaublockade(ByVal Spieler As Integer) As Baublockade
        Return New Baublockade(Baublockade.BauBlockade.Normal, Spieler)
    End Function
    Protected Function GetBildID() As Integer
        For I = 0 To Objektverwalter.KOS.Length - 1
            If Objektverwalter.KOS(I).KOID = KOID Then
                Return I
            End If
        Next
        Return 0
    End Function
    Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer)
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 48 * Emotion
            .Y = 350
            .Width = 48
            .Height = 48
        End With
        Grafikengine.ptfPosition = New Drawing.Point(X, Y)
        Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(Bild).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
    End Sub
    Public Sub KOMalen(ByVal X As Integer, ByVal Y As Integer)
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0
            .Y = 0
            .Width = 211
            .Height = 350
        End With
        Grafikengine.ptfPosition = New Drawing.Point(X, Y)
        Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(Bild).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
    End Sub
    Public Sub KOGesichtsausdruckMalen(ByVal Emotion As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal StartX As Integer, ByVal Höhe As Integer)
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 48 * Emotion
            .Y = 350 + StartX
            .Width = 48
            .Height = Höhe
        End With
        Grafikengine.ptfPosition = New Drawing.Point(X, Y)
        Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(Bild).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
    End Sub
    Public Sub MiniGesichtMalen(ByVal X As Integer, ByVal Y As Integer, ByVal Links As Boolean)
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 144
            .Y = 350
            .Width = 32
            .Height = 12
        End With
        If Links = True Then
            Grafikengine.recBild.Y += 12
        End If
        Grafikengine.ptfPosition = New Drawing.Point(X, Y)
        Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(Bild).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
    End Sub
    Public Function GetOffensivStärke(ByVal Einheit As ObjektEinheit) As Integer
        Dim Offensive As Integer = 100
        Dim S As ObjektSpieler = Nothing
        If Spieler > 0 Then
            If Not Objektverwalter.Spielfeld Is Nothing Then
                S = Objektverwalter.Spielfeld.Spieler(Spieler)
            End If
        End If
        If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
            If Not Wetterimmunität.Contains(Objektverwalter.Spielfeld.Regeln.Wetter) Then
                'Oh Sandsturm ist in DC\ DoR verdammt heftig
                If Objektverwalter.Spielfeld.Regeln.Wetter = ObjektSpielfeld.Wetterarten.Sandsturm Then
                    Offensive -= 30
                End If
            End If
        End If
        If GetKORange() < 0 Or Hauptmenü.Formmodus <> Hauptmenü.Formmodi.Spiel Then
            'Standard Bonus
            If IsNothing(OffensivStärke) = False Then
                Offensive = OffensivStärke.GetWert(Einheit.EinheitenID)
                If Offensive < 0 Then
                    Offensive = 100
                End If
            End If
            'Der Wetterbonus wird addiert
            If Not Objektverwalter.Spielfeld Is Nothing Then
                If Wetter = Objektverwalter.Spielfeld.Regeln.Wetter Then
                    Offensive += Wetterbouns
                End If
            End If
            'Der Geldstärkebonus wird addiert
            If Geldstärke > 0 Then
                If Not S Is Nothing Then
                    Dim Stärke As Integer = Math.DivRem(S.Fonds, Geldstärke, 0)
                    Offensive += Stärke * 10
                End If
            End If
            Offensive += Synergie
            If Not S Is Nothing Then
                If ATKundKostensteigererfürFonds.X <> 0 Then
                    Dim Einnahmen As Integer = S.Einkommen()
                    If Einnahmen > S.Fonds Then
                        Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                        Offensive -= Math.DivRem(Einnahmen - S.Fonds, EinnahmenProzent, 0) * ATKundKostensteigererfürFonds.X
                    ElseIf Einnahmen < S.Fonds Then
                        Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                        Offensive += Math.DivRem(S.Fonds - Einnahmen, EinnahmenProzent, 0) * ATKundKostensteigererfürFonds.X
                    End If
                End If
            End If

        End If
        If Not S Is Nothing Then
            If S.KOS(0).IsInKOZone(Einheit.X, Einheit.Y) Then
                Offensive += S.Sendetürme * SendeTurmStärke.X
            Else
                Offensive += S.Sendetürme * 10
            End If
        End If
        'Es könnte passieren das die Offensie null wird das sollte nicht passieren.
        If Offensive < 0 Then
            Offensive = 0
        End If
        Return Offensive
    End Function
    Public Function GetDeffensivStärke(ByVal Einheit As ObjektEinheit) As Integer
        Dim Deffensive As Integer = 100
        Dim S As ObjektSpieler = Nothing
        If Spieler > 0 Then
            If Not Objektverwalter.Spielfeld Is Nothing Then
                S = Objektverwalter.Spielfeld.Spieler(Spieler)
            End If
        End If

        If GetKORange() < 0 Or Hauptmenü.Formmodus <> Hauptmenü.Formmodi.Spiel Then
            If IsNothing(DeffensivStärke) = False Then
                Deffensive = DeffensivStärke.GetWert(Einheit.EinheitenID)
                If Deffensive < 0 Then
                    Deffensive = 100
                End If
            End If
            If Not S Is Nothing Then
                If S.KOS(0).IsInKOZone(Einheit.X, Einheit.Y) Then
                    Deffensive += S.Sendetürme * SendeTurmStärke.Y
                End If
            End If

        End If

        'Wenn unsere Deffensive zu hoch ist sind wir unzerstörbar und das würde die Spiellaune senken.
        If My.Settings.CommanderWarsGameMoodus < CommanderWarsGameModi.CommanderWars Then
            If Deffensive > ObjektSpieler.MaximaleDeffensivestärke Then Deffensive = ObjektSpieler.MaximaleDeffensivestärke
        End If
        If Deffensive < 0 Then Deffensive = 0

        Return Deffensive
    End Function
#Region "Gabe"
    Public Sub PlayGabeFüllMusik(Optional ByVal AlteGabeModus As Gabemodi = Gabemodi.Keine)
        If KannSpezialGabe() Then
            If AlteGabeModus < Gabemodi.Spezialgabe Then
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\SpezialgabeVoll.wav", False)
            End If
        ElseIf KannGabe() Then
            If AlteGabeModus < Gabemodi.Gabe Then
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Gabevoll.wav", False)
            End If
        End If
    End Sub
    Public Function KannGabe() As Boolean
        If Objektverwalter.Spielfeld.Spieler(Spieler).VeränderteWerte.Gabeeinsatz = True Then
            If Gabekosten > 0 Then
                If Gabeleiste >= Gabekosten * Sternkosten Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Function KannSpezialGabe() As Boolean
        If Objektverwalter.Spielfeld.Spieler(Spieler).VeränderteWerte.Gabeeinsatz = True Then
            If SpezialgabeKosten > 0 Then
                If Gabeleiste >= (Gabekosten + SpezialgabeKosten) * Sternkosten Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Sub Gabe()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.GabeEinsetzen
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Gabeleist -= Sternkosten * Gabekosten
        If Gabeleist < 0 Then
            'Da ist ein Cheater am Werk egal z.B. die KI Hä Hä
            Gabeleist = 0
        End If
        Gabemodus = Gabemodi.Gabe
        Dim WZeit As Integer = ObjektSpieler.TextWarteZeit
        Dim Text As String = Objektverwalter.KOS(Bild).KOBeschreibung.Gabesätze(Zufallszahl(0, Objektverwalter.KOS(Bild).KOBeschreibung.Gabesätze.Length - 1))
        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Bild, Text, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
        If Hauptmenü.Aufzeichnungsspulen Then
            Gabeeinsetzen()
        Else
            Objektverwalter.NeuObjektAnimation(0, 0, "GABEEINSATZ", "", True)
        End If



        'Ereignis Aufzeichnen.
        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.Gabe)

        'Für 3D
        Grafikengine.Lichtändern(LichtfarbeGabe)
    End Sub
    Public Sub Spezialgabe()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.SpezialgabeEinsetzen
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Gabeleist -= Sternkosten * (Gabekosten + SpezialgabeKosten)
        If Gabeleist < 0 Then
            'Da ist ein Cheater am Werk egal
            Gabeleist = 0
        End If
        Gabemodus = Gabemodi.Spezialgabe

        Dim WZeit As Integer = ObjektSpieler.TextWarteZeit
        Dim Text As String = Objektverwalter.KOS(Bild).KOBeschreibung.Gabesätze(Zufallszahl(0, Objektverwalter.KOS(Bild).KOBeschreibung.Gabesätze.Length - 1))
        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Bild, Text, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
        If Hauptmenü.Aufzeichnungsspulen Then
            Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).SpezialGabeeinsetzen()
        Else
            Objektverwalter.NeuObjektAnimation(0, 0, "GABEEINSATZ", "", True)
        End If


        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.Spezialgabe)

        'Für 3D
        Grafikengine.Lichtändern(LichtfarbeSpezial)
    End Sub
    Public Sub Doppelgabe()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.DoppelGabeEinsetzen
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Gabeleist -= Sternkosten * (Gabekosten + SpezialgabeKosten)
        If Gabeleist < 0 Then
            'Da ist ein Cheater am Werk egal
            Gabeleist = 0
        End If
        'Mal schauen ob es Synergien gibt und wenn ja welche!
        Synergie = CInt(CDec(10) * ObjektKOBeschreibung.GetSynergie(Objektverwalter.KOS(Bild), Objektverwalter.KOS(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild)))

        Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Synergie = Synergie

        Gabemodus = Gabemodi.Doppelgabe

        If Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Gabemodus = Gabemodi.Doppelgabe Then
            SpezialGabeeinsetzen()
        Else
            Dim WZeit As Integer = ObjektSpieler.TextWarteZeit
            Dim Sätze() As ObjektKOBeschreibung.DoppelGabesatz = Objektverwalter.KOS(Bild).KOBeschreibung.Doppelgabesätze
            Dim MöglicheSätze As ObjektKOBeschreibung.DoppelGabesatz() = {}
            For Each Satz In Sätze
                If Satz.KOID1 = Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).KOID Or Satz.KOID2 = Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).KOID Then
                    Array.Resize(MöglicheSätze, MöglicheSätze.Length + 1)
                    MöglicheSätze(MöglicheSätze.Length - 1) = Satz
                End If
            Next
            If MöglicheSätze.Length > 0 Then
                Dim Satz As Integer = Zufallszahl(0, MöglicheSätze.Length - 1)
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(MöglicheSätze(Satz).KOID1, MöglicheSätze(Satz).KOSatz1, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit) _
                                                                                                       , New ObjektKODialog.KOText(MöglicheSätze(Satz).KOID2, MöglicheSätze(Satz).KOSatz2, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
            Else
                Dim T1 As String = Objektverwalter.KOS(Bild).KOBeschreibung.Gabesätze(Zufallszahl(0, Objektverwalter.KOS(Bild).KOBeschreibung.Gabesätze.Length - 1))
                Dim T2 As String = Objektverwalter.KOS(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild).KOBeschreibung.Gabesätze(Zufallszahl(0, Objektverwalter.KOS(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild).KOBeschreibung.Gabesätze.Length - 1))
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Bild, T1, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit) _
                                                                                                       , New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).Bild, T2, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, WZeit)})
            End If
            If Hauptmenü.Aufzeichnungsspulen Then
                SpezialGabeeinsetzen()
            Else
                Objektverwalter.NeuObjektAnimation(0, 0, "GABEEINSATZ", "", True)
            End If
        End If

        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.Doppelgabe)

        'Für 3D
        Grafikengine.Lichtändern(LichtfarbeDoppel)
    End Sub

    Protected Sub AnimationEigene(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                            WZeit += 4
                            Objektverwalter.ZuFeldgehen(X, Y)
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationFeindliche(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                            WZeit += 4
                            Objektverwalter.ZuFeldgehen(X, Y)
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationEigenePanzer(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If E.Bewegungsart = MovementSorts.Ketten.ToString Or E.Bewegungsart = MovementSorts.Reifen.tostring Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationEigeneInfis(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If E.Bewegungsart = MovementSorts.Fuß.tostring Or E.Bewegungsart = MovementSorts.Mech.tostring Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationEigeneNahkampf(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If E.MinimaleReichweite = 1 Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationEigeneFernkampf(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If E.MaximaleReichweite > 1 Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationEigeneNahkampfAußerInfis(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If E.MinimaleReichweite = 1 Then
                                If Not E.Bewegungsart = MovementSorts.Fuß.tostring And Not E.Bewegungsart = MovementSorts.Mech.tostring Then
                                    BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                    WZeit += 4
                                    Objektverwalter.ZuFeldgehen(X, Y)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationEigeneLuftkampf(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If E.Bewegungsart = MovementSorts.Helikopter.tostring Or E.Bewegungsart = MovementSorts.Flugzeug.tostring Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationAlleAußerInfis(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If Not E.Bewegungsart = MovementSorts.Mech.tostring And Not E.Bewegungsart = MovementSorts.Fuß.tostring Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationNaturFeinde(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = True Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationNaturEigene(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = True Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Protected Sub AnimationBombenregen(ByVal Animation As String, ByRef WZeit As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude) = True Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                If Not Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Bewegungsart = MovementSorts.Flugzeug.tostring And Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Helikopter.tostring Then
                                    BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, I)
                                    WZeit += 4
                                    Objektverwalter.ZuFeldgehen(X, Y)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub

    ''' <summary>
    ''' Beendet die Gabenfunktion immer letzter Sub bei Gaben
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub GabeEingesetzt()
        If Objektverwalter.Spielfeld.GetCommanderWarsModus = CommanderWarsGameModi.AdvanceWarsDC Then
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If E IsNot Nothing Then
                            If E.Spieler = Spieler Then
                                If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                                    E.HatsichBewegt = True
                                End If
                            End If
                        End If
                    Next
                Next
            Next
        End If
        'Wir sagen dem Hauptthread das die Musik angehalten werden soll.
        Hauptmenü.MusikAnhalten = True
        Objektverwalter.Spielfeld.Sichterstellen()
    End Sub

    Public MustOverride Sub Gabeeinsetzen(Optional ByVal OhneFunktion As Boolean = False)
    Public MustOverride Sub SpezialGabeeinsetzen(Optional ByVal OhneFunktion As Boolean = False)
    Public MustOverride Sub KOFrame()
    Public Overridable Sub AfterBattle(ByVal Attacker As ObjektEinheit, ByVal Deffender As ObjektEinheit)

    End Sub

    Public Overridable Sub TagEnde()

    End Sub
    ''' <summary>
    ''' Zählt die Besetzungen
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function CountBuildings() As Integer
        Dim Gebäude As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Angriff = ObjektGebäude.Angriffe.Keiner Or Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Angriff = ObjektGebäude.Angriffe.Sendeturm Then
                                Gebäude += 1
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Return Gebäude
    End Function
    Public Sub Gabezurücksetzen()
        If Gabemodus > 0 Then
            Gabemodus = Gabemodi.Keine
            Dim KostenproStern As Integer = Sternkosten
            KOLaden()
            If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.AdvanceWarsDC Then
                If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars2 Then
                    Sternkosten = KostenproStern + 200
                End If
            End If
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.GebäudeID = "STADT" Then
                                Dim G As GebäudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                                G.KannBauen = False
                            End If
                            'Die Besetzungszahl wird wieder Hoch gesetzt
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = False Then
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                                End If
                            Else
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                            End If
                        End If
                    Next
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Beschädigt alle Feinde
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub AlleFeindeBeschädigen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            Schaden(X, Y, neuSchaden, I)
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Heilt alle eigenen Truppen
    ''' </summary>
    ''' <param name="Heilen"></param>
    ''' <remarks></remarks>
    Public Sub EigeneEinheitenHeilen(ByVal Heilen As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            Schaden(X, Y, -Heilen, I)
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Raubt einen Teil der Gabeleiste
    ''' </summary>
    ''' <param name="Geld"></param>
    ''' <remarks></remarks>
    Public Sub Gabenraub(ByVal Geld As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Not Objektverwalter.Spielfeld.Spieler(I).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                For I2 = 0 To Objektverwalter.Spielfeld.Spieler(I).KOS.Length - 1
                    If IsNothing(Objektverwalter.Spielfeld.Spieler(I).KOS(I2)) = False Then
                        Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Gabeleist -= Objektverwalter.Spielfeld.AktuellerSpieler.Fonds / Geld * Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Sternkosten
                        If Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Gabeleist < 0 Then
                            Objektverwalter.Spielfeld.Spieler(I).KOS(I2).Gabeleist = 0
                        End If
                    End If
                Next
            End If
        Next
    End Sub
    ''' <summary>
    ''' Fügt einer Einheit Schaden zu
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Schaden"></param>
    ''' <remarks></remarks>
    Protected Sub Schaden(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Schlacht As Integer)
        Dim NeuesLeben As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
        NeuesLeben *= 10
        If NeuesLeben > 100 Then
            NeuesLeben = 100
        ElseIf NeuesLeben <= 0 Then
            NeuesLeben = 1
        End If
        Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Leben = NeuesLeben
    End Sub
    ''' <summary>
    ''' Startet eine Rakete auf ein Ziel
    ''' </summary>
    ''' <param name="Schaden"></param>
    ''' <param name="Animation"></param>
    ''' <param name="Radius"></param>
    ''' <param name="Effekt"></param>
    ''' <param name="AnimationBuffer"></param>
    ''' <remarks></remarks>
    Public Sub Rakete(ByVal Schaden As Integer, ByVal Animation As String, ByVal Radius As Integer, ByVal Effekt As Effekte, Optional ByVal AnimationBuffer As Integer = 0)
        Dim Punkt As Point = New Point(0, 0)
        Dim Geld As Integer = 0
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                Dim Geld2 As Integer = GetSchadeninGeld(X, Y, Schaden, Radius)
                If Geld < Geld2 Then
                    Geld = Geld2
                    Punkt = New Point(X, Y)
                ElseIf Geld = Geld2 And Zufallszahl(0, 2) = 0 Then 'Damit Raketen gestreut landen
                    Geld = Geld2
                    Punkt = New Point(X, Y)
                End If
            Next
        Next
        Select Case Animation.ToUpper
            Case "METEOR"
                Objektverwalter.NeuObjektAnimation(Punkt, Animation, True, ObjektSpielfeld.Bodenschlacht)
            Case Else
                ObjektLadeklasse.SiloExplosion(Radius, Animation, Punkt.X, Punkt.Y, ObjektSpielfeld.Bodenschlacht)
        End Select
        Objektverwalter.ZuFeldgehen(Punkt.X, Punkt.Y)
        Silo(Punkt.X, Punkt.Y, Schaden, Radius, Effekt)
    End Sub
    ''' <summary>
    ''' Gibt zurück wie viel Schaden an dieser Stelle durch eine Rakete verursacht würde
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Schaden"></param>
    ''' <param name="Radius"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function GetSchadeninGeld(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Radius As Integer) As Integer
        Dim Geld As Integer = 0
        Dim Kreis(,) As Integer = Kreisfunktion(Radius)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If X - Radius + X1 >= 0 And X - Radius + X1 < Objektverwalter.Spielfeld.Breite And Y - Radius + Y1 >= 0 And Y - Radius + Y1 < Objektverwalter.Spielfeld.Höhe Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht)) = False Then
                            Dim VerlorenesLeben As Integer = Schaden
                            If VerlorenesLeben - Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP > 0 Then
                                If Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP > 1 Then
                                    VerlorenesLeben = Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).getKP
                                End If
                            End If
                            If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Geld -= Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).Kosten * VerlorenesLeben / 10 * 3
                            Else
                                Geld += Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).Kosten * VerlorenesLeben / 10
                            End If
                        End If
                    End If
                End If
            Next
        Next
        Return Geld
    End Function
    ''' <summary>
    ''' Richtet den Schaden einer Rakete an.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="neuSchaden"></param>
    ''' <param name="Radius"></param>
    ''' <param name="Effekt"></param>
    ''' <remarks></remarks>
    Protected Sub Silo(ByVal X As Integer, ByVal Y As Integer, ByVal neuSchaden As Integer, ByVal Radius As Integer, ByVal Effekt As Effekte)
        Dim Kreis(,) As Integer = Kreisfunktion(Radius)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If X - Radius + X1 >= 0 And X - Radius + X1 < Objektverwalter.Spielfeld.Breite And Y - Radius + Y1 >= 0 And Y - Radius + Y1 < Objektverwalter.Spielfeld.Höhe Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht)) = False Then
                            Schaden(X - Radius + X1, Y - Radius + Y1, neuSchaden, ObjektSpielfeld.Bodenschlacht)
                            Select Case Effekt
                                Case Effekte.Keiner
                                Case Effekte.Schock
                                    Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).HatsichBewegt = True
                                Case Effekte.Nuklearverseuchung
                                    Objektverwalter.Spielfeld.Einheiten(X - Radius + X1, Y - Radius + Y1, ObjektSpielfeld.Bodenschlacht).IncreaseRadioaktiveVerseuchung(neuSchaden)
                            End Select
                        End If
                    End If
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' Lässt alle Truppen außer INF noch mal ziehen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub NochmalZiehen()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            If Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Fuß.tostring And Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Mech.tostring Then
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt = False
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Einheiten auf Städten erleiden X  Schaden
    ''' Führt außerdem eine Animation aus.
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub Stadtschaden(ByVal neuSchaden As Integer)
        Dim WZeit As Integer = 2
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Schaden(X, Y, neuSchaden, I)
                                BackbufferSpiel.AddAnimation("DRAKEGABE", WZeit, New Point(X, Y), True, I)
                                WZeit += 4
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Schockt alle Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Schock()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt = True
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Truppen erhalten Ration
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub VollRation()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            Objektverwalter.Ration(X, Y, False, 0, I)
                            'So wäre es richtig glaube ich!
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).HasMaterial Then
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition = Objektverwalter.Spielfeld.Einheiten(X, Y, I).MunitionMax
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Ermöglicht den Bau von Truppen auf Städten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Stadtbauen()
        Dim Bauliste() As String = ObjektLadeklasse.GetBauliste("BASIS")
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.GebäudeID = "STADT" Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler Then
                                Dim G As GebäudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                                G.KannBauen = True
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Erstellt Einheiten mit Leben auf jeder eigenen Stadt
    ''' </summary>
    ''' <param name="EinheitID"></param>
    ''' <param name="Leben"></param>
    ''' <remarks></remarks>
    Public Sub Fallschrimspringer(ByVal EinheitID As String, ByVal Leben As Integer, ByVal Animation As String)
        Dim WZeit As Integer = 2
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude) = False Then
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude.GebäudeID = "STADT" Then
                        If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude.Spieler Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)) Then
                                BackbufferSpiel.AddAnimation(Animation, WZeit, New Point(X, Y), True, ObjektSpielfeld.Bodenschlacht)
                                WZeit += 4
                                Objektverwalter.ZuFeldgehen(X, Y)
                                Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht) = ObjektLadeklasse.NewEinheit(EinheitID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, X, Y, Leben, False)
                            End If
                        End If
                    End If
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' Verändert das Wetter für X Runden
    ''' </summary>
    ''' <param name="neuesWetter"></param>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub WetterÄndern(ByVal neuesWetter As ObjektSpielfeld.Wetterarten, ByVal Dauer As Integer)
        Objektverwalter.Spielfeld.Regeln.WetterÄndern(neuesWetter, Dauer)
    End Sub
    ''' <summary>
    ''' Klaut alle Feinden die hälfte ihrer Munition und Treibstoffvorräte
    ''' </summary>
    ''' <param name="Munition"></param>
    ''' <param name="Treibstoff"></param>
    ''' <remarks></remarks>
    Public Sub MuniTreibrauben(ByVal Munition As Boolean, ByVal Treibstoff As Boolean)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            If Munition = True Then
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition = -Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition / 2
                            End If
                            If Treibstoff = True Then
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Treibstoff = -Objektverwalter.Spielfeld.Einheiten(X, Y, I).Treibstoff / 2
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Feinde erhalten kein Einkommen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Keineinkommen()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Not Objektverwalter.Spielfeld.Spieler(I).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.KeineEinnahmen = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Wir erhalten für jedes feindliche Gebäude die hälfte der Fonds
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub GeldfürFeindlicheStädte()
        Dim Geld As Integer
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Not Objektverwalter.Spielfeld.Spieler(I).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Geld += Objektverwalter.Spielfeld.Spieler(I).Geldgebäude * Objektverwalter.Spielfeld.Spieler(I).FondsproStadt / 2
            End If
        Next
        Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Geld)
    End Sub
    ''' <summary>
    ''' Heilt eigene Einheiten und lässt den Gegner dafür Zahlen
    ''' </summary>
    ''' <param name="Heilung"></param>
    ''' <param name="KampfverstärkungfürmehrHeilung"></param>
    ''' <remarks></remarks>
    Public Sub Geldheilung(ByVal Heilung As Integer, ByVal KampfverstärkungfürmehrHeilung As Integer)
        Dim Kosten As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                            Dim Leben As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, I).getKP
                            Dim KP As Integer = Heilung
                            If KP + Leben > 10 Then
                                KP = 10 - Leben
                                Leben = 10
                            End If
                            'Wenn wir zuviel geheilt haben kämpfen wir besser.
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).ATKDEFBoost.X += KampfverstärkungfürmehrHeilung * (Heilung - KP)
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben = Leben * 10
                            Kosten += Objektverwalter.Spielfeld.Einheiten(X, Y, I).Kosten / 10 * KP
                        End If
                    End If
                Next
            Next
        Next
        Dim Feinde() As Integer = Objektverwalter.Spielfeld.GetGegner(Objektverwalter.Spielfeld.AktuellerSpieler)
        Kosten /= Feinde.Length
        For I = 0 To Feinde.Length - 1
            Objektverwalter.Spielfeld.Spieler(Feinde(I)).AddFonds(-Kosten)
        Next
    End Sub
    ''' <summary>
    ''' Wir erhalten die hälfte alle Fonds unserer Gegner
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GetHalfMoney()
        Dim Feinde() As Integer = Objektverwalter.Spielfeld.GetGegner(Objektverwalter.Spielfeld.AktuellerSpieler)
        For I = 0 To Feinde.Length - 1
            Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Objektverwalter.Spielfeld.Spieler(Feinde(I)).Fonds / 2)
            Objektverwalter.Spielfeld.Spieler(Feinde(I)).AddFonds(-Objektverwalter.Spielfeld.Spieler(Feinde(I)).Fonds / 2)
        Next
    End Sub
    ''' <summary>
    ''' Alle nicht Flugzeuge auf natürlichem Terrain erleiden Schaden
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub Bombenregen(ByVal neuSchaden As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude) = True Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                If Not Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht).Bewegungsart = MovementSorts.Flugzeug.tostring And Not Objektverwalter.Spielfeld.Einheiten(X, Y, I).Bewegungsart = MovementSorts.Helikopter.tostring Then
                                    Schaden(X, Y, neuSchaden, ObjektSpielfeld.Bodenschlacht)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle eigenen Einheiten auf nicht Gebäuden werden geheilt
    ''' </summary>
    ''' <param name="Heilrate"></param>
    ''' <remarks></remarks>
    Public Sub NaturHeilung(ByVal Heilrate As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = True Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                Schaden(X, Y, -Heilrate, I)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle feindlichen Einheiten auf nicht Gebäuden erleiden Schaden
    ''' </summary>
    ''' <param name="Damage"></param>
    ''' <remarks></remarks>
    Public Sub NaturGift(ByVal Damage As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = True Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                Schaden(X, Y, Damage, I)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Alle Städte verlieren einen Teil ihre Besetzungszahl für eine Runde und wir erhalten einen Teil des Geldes
    ''' </summary>
    ''' <param name="BesetzungsZahl"></param>
    ''' <remarks></remarks>
    Public Sub Besetzungsniedergang(ByVal BesetzungsZahl As Integer)
        Dim Fonds As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung > 0 Then
                                Dim B As Integer = BesetzungsZahl
                                If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung - B <= 0 Then
                                    B = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung - 1
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung = 1
                                End If
                                Fonds += B / 20 * Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler).FondsproStadt
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Objektverwalter.Spielfeld.AktuellerSpieler.AddFonds(Fonds)
    End Sub
    ''' <summary>
    ''' Dadurch kann kein feindlicher Spieler seine Gabe auffüllen bis zu seinem Zug ende.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinGabeleisteAuffüllung()
        For Each MitSpieler In Objektverwalter.Spielfeld.Spieler
            If MitSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                MitSpieler.VeränderteWerte.KeinGabeFortschritt = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' So übernimmt der Spieler eine zufällige Stadt.
    ''' </summary>
    ''' <param name="Zahl"></param>
    ''' <remarks></remarks>
    Public Sub StadtÜbernehmen(ByVal Zahl As Integer)

        'Wir suchen erst mal alle Städte
        Dim Gebäude As GebäudeStadt() = {}
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If Not Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude Is Nothing Then
                    If TypeOf Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude Is GebäudeStadt Then
                        Dim Stadt As GebäudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
                        If Stadt.Spieler = 0 Then
                            Array.Resize(Gebäude, Gebäude.Length + 1)
                            Gebäude(Gebäude.Length - 1) = Stadt
                        ElseIf Objektverwalter.Spielfeld.Spieler(Stadt.Spieler).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                            Array.Resize(Gebäude, Gebäude.Length + 1)
                            Gebäude(Gebäude.Length - 1) = Stadt
                        End If
                    End If
                End If
            Next
        Next
        If Gebäude.Length > 0 Then
            Dim Max As Integer = Zahl
            If Max > Gebäude.Length Then
                Max = Gebäude.Length
            End If
            For I = 1 To Zahl
                Dim Stadt As Integer
                'wir suchen eine Stadt heraus die wir übernehemen können
                Dim Zähler As Integer = 0
                Do
                    Stadt = Zufallszahl(0, Gebäude.Length - 1)
                    Zähler += 1
                Loop Until Gebäude(Stadt).GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team And Zähler < 999999
                Gebäude(Stadt).Besetzung = ObjektGebäude.Besetzungszahl
                'Das Gebäude wird nicht mehr besetzt
                If Not Objektverwalter.Spielfeld.Einheiten(Gebäude(Stadt).Rechteck.X, Gebäude(Stadt).Rechteck.Y, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                    Objektverwalter.Spielfeld.Einheiten(Gebäude(Stadt).Rechteck.X, Gebäude(Stadt).Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Besetzen = False
                End If
                'Jetzt übernehmen wir die Stadt=)
                Objektverwalter.Spielfeld.Spieler(Gebäude(Stadt).Spieler).Geldgebäude -= 1
                Objektverwalter.Spielfeld.Spieler(Spieler).Geldgebäude += 1
                Gebäude(Stadt).Spieler = Spieler
                GetBildID()
            Next
        End If
    End Sub
    ''' <summary>
    ''' Dadurch müssen alle Feinde ihre Besetzen von vorne Anfangen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RestartBesetzungen()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If Not Objektverwalter.Spielfeld.Einheiten(X, Y, I) Is Nothing Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = True Then
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = False
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Beschädigt alle Feinde und wenn sie weniger TP haben als unten gesagt können sie sich nicht mehr bewegen
    ''' </summary>
    ''' <param name="neuSchaden"></param>
    ''' <remarks></remarks>
    Public Sub Lähmungsschaden(ByVal neuSchaden As Integer, ByVal RestTP As Integer)
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            Schaden(X, Y, neuSchaden, I)

                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).getKP <= RestTP Then
                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt = True
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Eine zufällige Einheit erhält mehr Atk und einen Bewegungspunkt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub IncreaseAnyUnitATKandMovementPointsNachZerstörung()
        Dim AlleTruppen As ObjektEinheit() = {}
        For Each Einheit In Objektverwalter.Spielfeld.Einheiten
            If IsNothing(Einheit) = False Then
                If Einheit.Spieler = Spieler Then
                    If Einheit.HatsichBewegt = False Then
                        If Einheit.X <> Objektverwalter.Spielfeld.AktuelleEinheit.X And Einheit.Y <> Objektverwalter.Spielfeld.AktuelleEinheit.Y Then
                            Array.Resize(AlleTruppen, AlleTruppen.Length + 1)
                            AlleTruppen(AlleTruppen.Length - 1) = Einheit
                        End If
                    End If
                End If
            End If
        Next
        If AlleTruppen.Length > 0 Then
            Dim Einheit As ObjektEinheit = AlleTruppen(Zufallszahl(0, AlleTruppen.Length - 1))

            Einheit.Bewegungsbonus += AnyUnitKampfverstärker.Y
            Einheit.ATKDEFBoost.X += AnyUnitKampfverstärker.X
            Hauptmenü.NetzBefehlSendenEinheitVerbessern(Einheit.X, Einheit.Y, Einheit.GetMap, AnyUnitKampfverstärker.X, AnyUnitKampfverstärker.Y)
        End If
    End Sub
    ''' <summary>
    ''' Legt fest welches Glück und Pech unsere Gegner haben
    ''' </summary>
    ''' <param name="Glück"></param>
    ''' <param name="Pech"></param>
    ''' <remarks></remarks>
    Public Sub SetEnemyLuckandCurse(ByVal Glück As Integer, ByVal Pech As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.Glücksänderung = New Point(Glück, Pech)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Legt fest wie weit Gegner im Kriegsnebel sehen können.
    ''' </summary>
    ''' <param name="Sichtweite"></param>
    ''' <remarks></remarks>
    Public Sub SetEnemyVisionRange(ByVal Sichtweite As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.SichtradiusVeränderung = Sichtweite
            End If
        Next
    End Sub
    ''' <summary>
    ''' Aktiviert den Kriegsnebel für X Tage
    ''' </summary>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub ActivateKriegsnebel(ByVal Dauer As Integer)
        Dim Nebel As Nebelarten = Nebelarten.Aus
        For Each NeuSpieler In Objektverwalter.Spielfeld.Spieler
            If NeuSpieler.KOS(0).KriegsnebelErstellung.X > 0 Then
                Nebel = NeuSpieler.KOS(0).KriegsnebelErstellung.X
                Exit For
            ElseIf Not NeuSpieler.KOS(1) Is Nothing Then
                If NeuSpieler.KOS(1).KriegsnebelErstellung.X > 0 Then
                    Nebel = NeuSpieler.KOS(0).KriegsnebelErstellung.X
                    Exit For
                End If
            End If
        Next
        KriegsnebelErstellung = New Point(Nebel, Dauer)
        Objektverwalter.Spielfeld.Regeln.Nebel = Nebelarten.Kriegsnebel
    End Sub
    ''' <summary>
    ''' Sorgt dafür das Gegner keine Gabe einsetzen können
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinGabeEinsatz()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.Gabeeinsatz = False
            End If
        Next
    End Sub
    ''' <summary>
    ''' Sorgt dafür das Gegner nur mit Infanteristen angreifen können
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinAngriffAußerInfanterie()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.KeinAngriffaußerINF = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Alle TP der Gegner werden abgerundet
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Lebensabrundung()
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben = Math.DivRem(CInt(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben), 10, 0) * 10
                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben <= 0 Then Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben = 1
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Gegner sehen feindliche TP nicht mehr.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinTPSehungFeinde()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.FeindlicheTPVersteckt = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner sehen eigene TP nicht mehr.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeinTPSehungEigene()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.EigeneTPVersteckt = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner sehen eigene TP nicht mehr.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeineVersorgung(ByVal Dauer As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.KeineVersorgung = New Point(1, Dauer)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Jeder Spieler bekommt weniger Geld für Besetzungen die von feinden Besetzt werden.
    ''' </summary>
    ''' <param name="Wert"></param>
    ''' <remarks></remarks>
    Public Sub WenigerEinahmendurchBesetzungszahl(ByVal Wert As Single)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.GeldproBesetzungszahl += Wert
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner können keine Truppen bauen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KeineTruppenBau()
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.KeinBau = True
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gegner haben immer nur noch so viel Deckung
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AndereDeckung(ByVal Veränderung As Single)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.TerrainVeränder = Veränderung
            End If
        Next
    End Sub
    ''' <summary>
    ''' Setzt die BEwegungspunkte für dieses Feld fest
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub BewegungspunkteFestlegen(ByVal X As Integer, ByVal Y As Integer)
        If BewegungsKostenÄnderungNachZerstörung.Y = 1 Then
            Objektverwalter.Spielfeld.Spieler(Spieler).VeränderteWerte.VeränderteBewegungsFelder.Push(New Vector3(X, Y, BewegungsKostenÄnderungNachZerstörung.X))
        ElseIf BewegungsKostenÄnderungNachZerstörung.Y = 2 Then
            For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                    Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.VeränderteBewegungsFelder.Push(New Vector3(X, Y, BewegungsKostenÄnderungNachZerstörung.X))
                End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Wir erhalten die Hälfte aller feindlichen Einkünfte
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GetHalfIncome()
        Dim Feinde() As Integer = Objektverwalter.Spielfeld.GetGegner(Objektverwalter.Spielfeld.AktuellerSpieler)
        For Each Feind In Feinde
            Objektverwalter.Spielfeld.Spieler(Spieler).AddFonds((Objektverwalter.Spielfeld.Spieler(Feind).FondsproStadt * Objektverwalter.Spielfeld.Spieler(Feind).Geldgebäude) / 2)
            Objektverwalter.Spielfeld.Spieler(Feind).VeränderteWerte.Einkommensveränderung = 0.5
        Next
    End Sub
    ''' <summary>
    ''' Gibt alle Einheiten dieses Spielers zurück
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetUnits() As ObjektEinheit()
        Dim Truppen As ObjektEinheit() = {}
        For Each Unit In Objektverwalter.Spielfeld.Einheiten
            If Not Unit Is Nothing Then
                If Unit.Spieler = Spieler Then
                    Array.Resize(Truppen, Truppen.Length + 1)
                    Truppen(Truppen.Length - 1) = Unit
                End If
            End If
        Next
        Return Truppen
    End Function
    ''' <summary>
    ''' Gegner haben erhöhte Bewegungskosten
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub HöhereBewegungskosten(ByVal Veränderung As Integer)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                Objektverwalter.Spielfeld.Spieler(I).VeränderteWerte.Bewegungskosten += Veränderung
            End If
        Next
    End Sub
    ''' <summary>
    ''' Unser Gegner erhält pro eigener Einheit die ihn Angreifen kann Schaden
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Zusatzangriffe()
        Dim Units As ObjektEinheit() = GetUnits()
        For Each Gegner In Objektverwalter.Spielfeld.Einheiten
            Dim Schaden As Integer = 0
            If Not Gegner Is Nothing Then
                If Objektverwalter.Spielfeld.Spieler(Gegner.Spieler).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                    For Each Unit In Units
                        If Unit.IsInFirerange(Gegner) = True Then
                            If Unit.IsAttackable(Gegner, False) = True Then
                                Schaden += Unit.GetGroundDamage(Gegner, False) * Unit.getKP / 10
                            End If
                        End If
                    Next
                    Gegner.Leben -= Schaden
                    If Gegner.Leben <= 0 Then
                        Gegner.Leben = 1
                    End If
                End If
            End If
        Next
    End Sub
    ''' <summary>
    ''' Entfernt ein Bonusgebäude aus dem Array
    ''' </summary>
    ''' <param name="Ort"></param>
    ''' <remarks></remarks>
    Public Sub RemoveBonusGebäude(ByVal Ort As Point)
        For I = 0 To BonusGebäude.Length - 1
            If Ort.X = BonusGebäude(I).X And Ort.Y = BonusGebäude(I).Y Then
                RemoveBonusGebäude(I)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Entfernt ein Bonusgebäude aus dem Array
    ''' </summary>
    ''' <param name="Stelle"></param>
    ''' <remarks></remarks>
    Public Sub RemoveBonusGebäude(ByVal Stelle As Integer)
        BonusGebäude(Stelle) = BonusGebäude(BonusGebäude.Length - 1)
        Array.Resize(BonusGebäude, BonusGebäude.Length - 1)
    End Sub
    ''' <summary>
    ''' Fügt eine Gebäude dem Array hinzu.
    ''' </summary>
    ''' <param name="Ort"></param>
    ''' <remarks></remarks>
    Public Sub AddBonusgebäude(ByVal Ort As Point)
        For I = 0 To BonusGebäude.Length - 1
            If BonusGebäude(I).X = Ort.X And BonusGebäude(I).Y = Ort.Y Then
                BonusGebäude(I).Z += BesetzungsbonusNachEinheitenZerstörung
                Exit Sub
            End If
        Next
        Array.Resize(BonusGebäude, BonusGebäude.Length + 1)
        BonusGebäude(BonusGebäude.Length - 1) = New Vector3(Ort.X, Ort.Y, BesetzungsbonusNachEinheitenZerstörung)
    End Sub
    ''' <summary>
    ''' Gibt das Bonusgebäude zurück -1 gleich keines Gefunden.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetBonusgebäude(ByVal X As Integer, ByVal Y As Integer) As Integer
        For I = 0 To BonusGebäude.Length - 1
            If BonusGebäude(I).X = X And BonusGebäude(I).Y = Y Then
                Return I
            End If
        Next
        Return -1
    End Function
    ''' <summary>
    ''' Lädt den KO so wie er vor dem Spechern war.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KONachSpielstandladenLaden()
        KOLaden()
        Select Case Gabemodus
            Case ObjektKO.Gabemodi.Gabe
                Gabeeinsetzen(True)
            Case ObjektKO.Gabemodi.Spezialgabe
                SpezialGabeeinsetzen(True)
            Case ObjektKO.Gabemodi.Doppelgabe
                SpezialGabeeinsetzen(True)
        End Select
    End Sub
    ''' <summary>
    ''' Plaziert eine Armee auf der Karte.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Invasion(ByVal InvasionsTruppen() As String)
        Dim InvasionsStadt As ObjektGebäude = Nothing
        Dim Entfernung As Integer = -1
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = "STADT" Then
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude.Spieler = Spieler Then
                        Dim E As New EinheitJagdpanzer(Spieler, X, Y, False)
                        Dim WSS As New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, -1)
                        Dim Ziel As Point = GetNähestenFeindVonGebäude(E, WSS)
                        Dim Entfernung2 As Integer = WSS.getBewegungspunktekosten(Ziel)
                        If Entfernung < 0 Then
                            InvasionsStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
                            Entfernung = Entfernung2
                        ElseIf Entfernung2 < Entfernung Then
                            InvasionsStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
                            Entfernung = Entfernung2
                        ElseIf Entfernung = Entfernung2 And Zufallszahl(0, 1) = 0 Then
                            InvasionsStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
                            Entfernung = Entfernung2
                        End If
                    End If
                End If
            Next
        Next
        If Not InvasionsStadt Is Nothing Then
            For I = 0 To InvasionsTruppen.Length - 1
                Dim Einheit As ObjektEinheit = ObjektLadeklasse.NewEinheit(InvasionsTruppen(I), Spieler, -1, -1, False)
                Objektverwalter.Spielfeld.PlaceUnit(Einheit, InvasionsStadt.Rechteck.X, InvasionsStadt.Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
            Next
        End If
    End Sub
    ''' <summary>
    ''' Gibt zurück welche Landschaft diese Landschaft für den KO ist. Wegkosten.
    ''' Olaf Schnee zu Ebene.
    ''' </summary>
    ''' <param name="LandschaftsID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetLandschaft(ByVal LandschaftsID As String) As String
        If LandschaftsVertauschung.Length > 0 Then
            For I = 0 To LandschaftsVertauschung.GetLength(0) - 1
                If LandschaftsVertauschung(I, 0) = LandschaftsID Then
                    Return LandschaftsVertauschung(I, 1)
                End If
            Next
            Return LandschaftsID
        Else
            Return LandschaftsID
        End If
    End Function
    ''' <summary>
    ''' Macht Besetzungen Neutral außer HQS
    ''' </summary>
    ''' <param name="Besetzungszahl"></param>
    ''' <remarks></remarks>
    Public Sub NeutraleBesetzungMachen(ByVal Besetzungszahl As Integer)
        Dim Schlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Besetzung > 0 Then
                            If G.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                If G.Besetzung < Besetzungszahl Then
                                    If G.Angriff <> ObjektGebäude.Angriffe.HQ Then
                                        'Diese Besetzung wird neutral
                                        Select Case G.Angriff
                                            Case ObjektGebäude.Angriffe.Sendeturm
                                                Objektverwalter.Spielfeld.Spieler(G.Spieler).Sendetürme -= 1
                                            Case ObjektGebäude.Angriffe.Mine
                                                Objektverwalter.Spielfeld.Spieler(G.Spieler).Minen -= 1
                                        End Select
                                        If G.getFonds = True Then
                                            Objektverwalter.Spielfeld.Spieler(G.Spieler).Geldgebäude -= 1
                                        End If
                                        G.Spieler = 0
                                        G.getBildID(Nothing)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Lässt Geld pro neutralem Gebäude verdienen.
    ''' </summary>
    ''' <param name="GeldProGebäude"></param>
    ''' <remarks></remarks>
    Public Sub GetNeutralesGeld(ByVal GeldProGebäude As Integer)
        Dim NeutraleGebäude As Integer = 0
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Spieler = 0 Then
                            If G.getFonds = True Then
                                NeutraleGebäude += GeldProGebäude
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Objektverwalter.Spielfeld.Spieler(Spieler).AddFonds(NeutraleGebäude)
    End Sub
    ''' <summary>
    ''' Schockt den prozentualen Teil aller Feinde
    ''' </summary>
    ''' <param name="ProzentualerTeil"></param>
    ''' <remarks></remarks>
    Public Sub SchockEnemys(ByVal ProzentualerTeil As Integer)
        If ProzentualerTeil <= 0 Then Exit Sub
        If ProzentualerTeil > 100 Then ProzentualerTeil = 100
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                Dim Units As ObjektEinheit() = Objektverwalter.Spielfeld.Spieler(I).KOS(0).GetUnits
                Dim SchockZahl As Integer = Units.Length * (ProzentualerTeil / 100)
                For I2 = 1 To SchockZahl
                    Dim Unit As Integer = Zufallszahl(0, Units.Length - I2)
                    Units(Unit).HatsichBewegt = True
                    Units(Unit) = Units(Units.Length - I2)
                Next
            End If
        Next
    End Sub
    ''' <summary>
    ''' Sorgt dafür das Nahkampfeinheiten sich untereinander bekriegen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub EnemyBattle()
        Dim Schlacht As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If Not E Is Nothing Then
                        If E.MinimaleReichweite = 1 Then
                            'ein Nahkämpfer
                            If E.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                'es ist ein Feind
                                If E.HatsichBewegt = False Then
                                    Dim Opfer() As ObjektEinheit = GetAttackableUnits(E)
                                    If Opfer.Length > 0 Then
                                        Dim Enemy As ObjektEinheit = Opfer(Zufallszahl(0, Opfer.Length - 1))
                                        Objektverwalter.Angriff(E, Enemy.X, Enemy.Y)
                                        E.HatsichBewegt = True
                                        Enemy.HatsichBewegt = True
                                    End If
                                End If
                            End If
                        Else
                            'ein Fernkämpfer
                            If E.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                'es ist ein Feind
                                If E.HatsichBewegt = False Then
                                    Dim Opfer() As ObjektEinheit = GetAttackableFernkampfUnits(E)
                                    If Opfer.Length > 0 Then
                                        Dim Enemy As ObjektEinheit = Opfer(Zufallszahl(0, Opfer.Length - 1))
                                        Objektverwalter.Angriff(E, Enemy.X, Enemy.Y)
                                        E.HatsichBewegt = True
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Gibt die Felder zurück die von diesem Feld aus angegriffen werden können
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <remarks></remarks>
    Public Function GetAttackableUnits(ByVal Einheit As ObjektEinheit, Optional ByVal PosX As Integer = -1, Optional ByVal PosY As Integer = -1) As ObjektEinheit()
        Dim Units As ObjektEinheit() = {}
        If PosX < 0 Or PosY < 0 Then
            PosX = Einheit.X
            PosY = Einheit.Y
        End If
        Dim X2 As Integer = PosX
        Dim Y2 As Integer = PosY
        For I = 0 To 3
            Select Case I
                Case 0
                    X2 -= 1
                Case 1
                    X2 += 1
                    Y2 -= 1
                Case 2
                    X2 += 1
                    Y2 += 1
                Case 3
                    X2 -= 1
                    Y2 += 1
            End Select
            If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                Dim P2 As New Point(X2, Y2)
                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(P2.X, P2.Y, Einheit.GetMap)
                If Not E Is Nothing Then
                    If Einheit.IsAttackable(E, True) = True Then
                        Array.Resize(Units, Units.Length + 1)
                        Units(Units.Length - 1) = E
                    End If
                End If
            End If
        Next
        Return Units
    End Function
    ''' <summary>
    ''' Fernkämpfer greifen nur feinde an nicht unsere.
    ''' </summary>
    ''' <param name="Unit"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetAttackableFernkampfUnits(ByVal Unit As ObjektEinheit) As ObjektEinheit()
        Dim Units As ObjektEinheit() = {}
        Dim Felder As Point() = {}
        If Unit.MaximaleReichweite > 1 Then
            Dim MaximaleReichweite As Integer = Unit.MaximaleReichweite
            Dim MinimaleReichweite As Integer = Unit.MinimaleReichweite
            If MaximaleReichweite > 1 Then
                Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)
                For X1 = 0 To MaximaleReichweite * 2
                    For Y1 = 0 To MaximaleReichweite * 2
                        If Kreis(X1, Y1) >= MinimaleReichweite Then
                            Dim neuerPunkt As Point = New Point(Unit.X - MaximaleReichweite + X1, Unit.Y - MaximaleReichweite + Y1)
                            If neuerPunkt.X >= 0 And neuerPunkt.X < Objektverwalter.Spielfeld.Breite And neuerPunkt.Y >= 0 And neuerPunkt.Y < Objektverwalter.Spielfeld.Höhe Then
                                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(neuerPunkt.X, neuerPunkt.Y, Unit.GetMap)
                                If Not E Is Nothing Then
                                    If E.GetSpieler.Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                                        If Unit.IsAttackable(E, True) Then
                                            Array.Resize(Units, Units.Length + 1)
                                            Units(Units.Length - 1) = Unit
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    Next
                Next
            End If
        End If
        Return Units
    End Function
    ''' <summary>
    ''' Erstellt ein Gebäude in der nähe einer Stadt. Hinweis es dürfen nur kleine Gebäude sein.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CreateGebäude(ByVal GebäudeID As String)
        Dim Städte As GebäudeStadt() = {}
        For X = 0 To Objektverwalter.Spielfeld.Breite - 1
            For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID = "STADT" Then
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude.Spieler = Spieler Then
                        Array.Resize(Städte, Städte.Length + 1)
                        Städte(Städte.Length - 1) = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
                    End If
                End If
            Next
        Next
        If Städte.Length > 0 Then
            Dim InvasionsStadt As ObjektGebäude = Städte(Zufallszahl(0, Städte.Length - 1))
            If Not InvasionsStadt Is Nothing Then
                Dim G As ObjektGebäude = ObjektLadeklasse.NewGebäude(GebäudeID, Spieler, -1, -1, False)
                Objektverwalter.Spielfeld.PlaceBuilding(G, InvasionsStadt.Rechteck.X, InvasionsStadt.Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
            End If
        End If
    End Sub
    Public Sub HealBuildings(ByVal Leben As Integer)
        Dim Schlacht As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Spieler = Spieler Then
                            If G.KP > 0 Then
                                If G.GetRealGebäudeID <> "VERWEIS" Then
                                    G.KP = Leben + G.KP
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    Public Sub GebäudeNochmalSchießen()
        Dim Schlacht As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Spieler = Spieler Then
                            If G.GetRealGebäudeID <> "VERWEIS" Then
                                If G.Feuerbereit > 0 Then
                                    G.SetFeuerbereit(0)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Gibt das Feld zurück auf das wir ziehen sollten um möglichst bald angreifen zu können. Mit einer Nahkampfeinheit
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <param name="WSS"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetNähestenFeindVonGebäude(ByVal Einheit As ObjektEinheit, Optional ByRef WSS As Wegsuchsystem = Nothing) As Point
        Dim Ziel As New Point(-1, -1)
        Dim MomentaneWegkosten As Integer = -1
        If Einheit.MinimaleReichweite = 1 Then
            If WSS Is Nothing Then
                WSS = New Wegsuchsystem(Einheit, Einheit.X, Einheit.Y, Einheit.GetMap, -1)
            End If
            Dim BewMax As Integer = Einheit.GetMovementRange
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim Bew As Integer = WSS.getBewegungspunktekosten(X, Y)
                    If Bew >= 0 Then
                        If ObjektKI.IsFeldLeer(X, Y, Einheit) Then
                            'Wir können das Feld erreichen
                            If KannNahkampfvonFeldgemachtwerden(Einheit, X, Y) = True Then
                                If Bew < MomentaneWegkosten And Bew > BewMax Then
                                    MomentaneWegkosten = Bew
                                    Ziel = New Point(X, Y)
                                ElseIf Bew = MomentaneWegkosten And Zufallszahl(0, 1) = 1 Then
                                    MomentaneWegkosten = Bew
                                    Ziel = New Point(X, Y)
                                ElseIf MomentaneWegkosten = -1 Then
                                    MomentaneWegkosten = Bew
                                    Ziel = New Point(X, Y)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
        Return Ziel
    End Function
    ''' <summary>
    ''' Überprüft ob von diesem Feld per Nahangriff eine Einheit angegriffen werden kann
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function KannNahkampfvonFeldgemachtwerden(ByVal Einheit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer) As Boolean
        If Not Einheit.Waffe1 = "Keine" Or Einheit.MinimaleReichweite = 1 Then
            Dim X2 As Integer = X
            Dim Y2 As Integer = Y
            For I = 0 To 3
                Select Case I
                    Case 0
                        X2 -= 1
                    Case 1
                        X2 += 1
                        Y2 -= 1
                    Case 2
                        X2 += 1
                        Y2 += 1
                    Case 3
                        X2 -= 1
                        Y2 += 1
                End Select
                If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                    If Einheit.IsAttackable(Objektverwalter.Spielfeld.Einheiten(X2, Y2, ObjektSpielfeld.Bodenschlacht), True) = True Then
                        Return True
                    End If
                End If
            Next
        End If
        Return False
    End Function
#End Region
#Region "3D"

    Public Function getLichtfarbe() As Color
        Select Case Gabemodus
            Case Gabemodi.Doppelgabe
                Return LichtfarbeDoppel
            Case Gabemodi.Spezialgabe
                Return LichtfarbeSpezial
            Case Gabemodi.Gabe
                Return LichtfarbeGabe
            Case Else
                Return LichtfarbeNormal
        End Select
    End Function
#End Region
End Class
